package com.pengliu.common.manager;

import com.github.pagehelper.PageInfo;
import com.pengliu.common.mybatis.model.Model;
import com.pengliu.common.mybatis.model.ModelExample;
import com.pengliu.common.mybatis.page.Page;

import java.util.List;

/**
 * user: pengliu
 * date: 2017年10月17日
 * desc:
 * @author pengliu
 */
public interface Manager<M extends Model, E extends ModelExample, ID> {

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件查询数量
	 * @param example
	 * @return 总数
	 * @author pengliu
	 */
	int countByExample(E example);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件删除数据
	 * @param example
	 * @return 更新数
	 * @author pengliu
	 */
	int deleteByExample(E example);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据主机删除数据
	 * @param id
	 * @return 更新数
	 * @author pengliu
	 */
	int deleteByPrimaryKey(ID id);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据实体新增数据
	 * @param model
	 * @return
	 * @author pengliu
	 */
	int insert(M model);
	
	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据实体更新数据
	 * @param model
	 * @return
	 * @author pengliu
	 */
	M insertObject(M model);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件查询
	 * @param example
	 * @return
	 * @author pengliu
	 */
	List<M> selectByExample(E example);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据主键查询实体
	 * @param id
	 * @return
	 * @author pengliu
	 */
	M selectByPrimaryKey(ID id);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件查询单个实体
	 * @param example
	 * @return
	 * @author pengliu
	 */
	M selectOneByExample(E example);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件分页
	 * @param example
	 * @param page
	 * @return
	 * @author pengliu
	 */
	Page<M> selectPageByExample(E example,Page<M> page);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据条件修改数据
	 * @param model
	 * @param example
	 * @return
	 * @author pengliu
	 */
	int updateByExampleSelective(M model, E example);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 根据主键修改数据
	 * @param model
	 * @return
	 * @author pengliu
	 */
	int updateByPrimaryKeySelective(M model);

	/**
	 * user: pengliu
	 * date: 2017年10月17日
	 * desc: 分页查询
	 * @param example
	 * @return
	 * @author pengliu
	 */
	PageInfo<M> selectPageInfo(E example);

}
